package com.lagou.bigdata.task04;

import java.io.*;
import java.net.Socket;
import java.util.List;

/**
 * 编程实现服务器端的线程处理类
 */
public class ServerThread extends Thread {
    /**
     * 用于记录当前正在通信的客户端Socket信息
     */
    private Socket socket;
    /**
     * 用于记录所有在线客户端的Socket
     */
    private List<Socket> clientList;

    /**
     * 自定义构造方法实现成员变量的初始化
     * @param socket
     * @param clientList
     */
    public ServerThread(Socket socket, List<Socket> clientList) {
        this.socket = socket;
        this.clientList = clientList;
    }

    /**
     * 自定义线程处理方法实现与客户端的通信
     */
    @Override
    public void run() {
        ObjectInputStream objectInputStream = null;

        try {
            // 1.使用输入输出流进行通信，首先实现流对象的初始化操作
            objectInputStream = new ObjectInputStream(socket.getInputStream());

            while (true) {
                // 2.读取客户端发来的消息类型来区分到底是文字聊天还是文件传输
                System.out.println("服务器等待数据的到来...");
                CommunicationMessage communicationMessage = (CommunicationMessage) objectInputStream.readObject();
                // System.out.println("服务器接收到的内容是：" + communicationMessage);
                if ("chat".equals(communicationMessage.getType())) {
                    // 当客户端发来的内容为"bye"时，则聊天结束
                    if ("bye".equals(communicationMessage.getContent())) {
                        System.out.println("客户端" + socket.getInetAddress() + "已下线！");
                        // 将下线的客户端从集合中移除
                        clientList.remove(socket);
                        break;
                    }
                    // 否则实现服务器向所有客户端进行转发，也就是遍历所有客户端的Socket即可
                    for (Socket ts : clientList) {
                        if (ts != socket) {
                            ObjectOutputStream objectOutputStream1 = new ObjectOutputStream(ts.getOutputStream());
                            objectOutputStream1.writeObject(communicationMessage);
                        }
                    }
                } else {
                    // 读取文件名称并创建对应的流对象
                    System.out.println("这个我就不写了，大家按照这个框架思路自己写写吧！");
                }
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (null != objectInputStream) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
